// stores/playlist.ts
import { defineStore } from 'pinia'

// 定义音乐信息的类型（与组件中保持一致）
interface MusicInfo {
  id?: string
  name?: string
  artist?: string
  coverImgUrl?: string
  url?: string
}

// 定义 playlist Store 的状态类型
interface PlaylistState {
  playerMusicUrl: string // 当前播放音乐的 URL
  playerMusicInfo: MusicInfo // 当前播放音乐的信息
  // 可以添加其他状态，如播放列表、当前索引等
  // playList: MusicInfo[]
  // currentIndex: number
}

// 定义并导出 Store（第一个参数是唯一ID，第二个参数是配置对象）
export const usePlaylistStore = defineStore('playlist', {
  // 状态初始化（对应 Vuex 的 state）
  state: (): PlaylistState => ({
    playerMusicUrl: '', // 初始化为空字符串
    playerMusicInfo: {} // 初始化为空对象
  }),

  // 计算属性（对应 Vuex 的 getters）
  getters: {
    // 示例：获取当前播放音乐的名称（带默认值）
    currentMusicName: (state) => state.playerMusicInfo.name || '未知歌曲',
    // 示例：判断是否有正在播放的音乐
    isPlaying: (state) => !!state.playerMusicUrl
  },

  // 方法（对应 Vuex 的 mutations + actions，Pinia 中统一用 actions）
  actions: {
    // 更新当前播放的音乐 URL（同步操作，类似 Vuex 的 mutation）
    setPlayerMusicUrl(url: string) {
      this.playerMusicUrl = url
    },

    // 更新当前播放的音乐信息（同步操作）
    setPlayerMusicInfo(info: MusicInfo) {
      this.playerMusicInfo = info
    },

    // 示例：切换播放的音乐（可包含异步逻辑，类似 Vuex 的 action）
    async changeMusic(music: MusicInfo) {
      // 模拟异步获取音乐 URL（实际项目中可能调用接口）
      if (music.id) {
        // 假设这里是异步请求：const url = await api.getMusicUrl(music.id)
        const mockUrl = `https://example.com/music/${music.id}.mp3`
        this.setPlayerMusicUrl(mockUrl) // 调用同步方法更新状态
      }
      this.setPlayerMusicInfo(music) // 更新音乐信息
    },

    // 清空播放状态
    clearPlayerState() {
      this.playerMusicUrl = ''
      this.playerMusicInfo = {}
    }
  }
})